<?php
declare (strict_types = 1);

namespace app\api\service;

use think\facade\Cache;

/**
 * Token 服务类
 * 用于生成和验证用户 Token
 */
class TokenService
{
    // Token 前缀
    private const TOKEN_PREFIX = 'user_token:';
    
    // Token 过期时间（秒），默认 7 天
    private const TOKEN_EXPIRE = 7 * 24 * 3600;
    
    /**
     * 生成 Token
     * @param int $userId 用户ID
     * @param array $data 附加数据
     * @param int $expire 过期时间（秒），不传则使用默认值
     * @return string
     */
    public static function generate(int $userId, array $data = [], int $expire = 0): string
    {
        // 生成唯一的 token
        $token = md5(uniqid() . $userId . time() . rand(1000, 9999));
        
        // 准备缓存数据
        $cacheData = array_merge([
            'user_id' => $userId,
            'create_time' => time(),
        ], $data);
        
        // 使用传入的过期时间，如果没有传入则使用默认值
        $expireTime = $expire > 0 ? $expire : self::TOKEN_EXPIRE;
        
        // 存储到缓存
        Cache::set(self::TOKEN_PREFIX . $token, $cacheData, $expireTime);
        
        return $token;
    }
    
    /**
     * 验证 Token
     * @param string $token
     * @return array|false 返回用户数据或 false
     */
    public static function verify(string $token)
    {
        if (empty($token)) {
            return false;
        }
        
        $cacheKey = self::TOKEN_PREFIX . $token;
        $data = Cache::get($cacheKey);
        
        if ($data === null || $data === false) {
            return false;
        }
        
        // 延长 token 有效期（滑动过期）
        Cache::set($cacheKey, $data, self::TOKEN_EXPIRE);
        
        return $data;
    }
    
    /**
     * 删除 Token（退出登录）
     * @param string $token
     * @return bool
     */
    public static function delete(string $token): bool
    {
        if (empty($token)) {
            return false;
        }
        
        return Cache::delete(self::TOKEN_PREFIX . $token);
    }
    
    /**
     * 刷新 Token（延长有效期）
     * @param string $token
     * @return bool
     */
    public static function refresh(string $token): bool
    {
        $data = self::verify($token);
        
        if ($data === false) {
            return false;
        }
        
        // 更新缓存时间
        Cache::set(self::TOKEN_PREFIX . $token, $data, self::TOKEN_EXPIRE);
        
        return true;
    }
    
    /**
     * 获取 Token 信息
     * @param string $token
     * @return array|false
     */
    public static function getInfo(string $token)
    {
        if (empty($token)) {
            return false;
        }
        
        return Cache::get(self::TOKEN_PREFIX . $token);
    }
}
